  test-{{ lowercase_group }}:
    name: {{ group }}
    timeout-minutes: 30
    runs-on: {% raw %}${{ matrix.os }}{% endraw %}
    strategy:
      fail-fast: false
      matrix:
        python-version: [{{ py_versions|join(",") }}]
        # python3.6 reached EOL and is no longer being supported on
        # new versions of hosted runners on Github Actions
        # ubuntu-20.04 is the last version that supported python3.6
        # see https://github.com/actions/setup-python/issues/544#issuecomment-1332535877
        os: [ubuntu-22.04]

    {% if needs_docker %}
    services:
      docker:
        image: docker:dind  # Required for Docker network management
        options: --privileged  # Required for Docker-in-Docker operations
    {% endif %}
    {% if needs_postgres %}
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: sentry
        # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        # Maps tcp port 5432 on service container to the host
        ports:
          - 5432:5432
    env:
      SENTRY_PYTHON_TEST_POSTGRES_HOST: {% raw %}${{ matrix.python-version == '3.6' && 'postgres' || 'localhost' }}{% endraw %}
      SENTRY_PYTHON_TEST_POSTGRES_USER: postgres
      SENTRY_PYTHON_TEST_POSTGRES_PASSWORD: sentry

    {% endif %}
    # Use Docker container only for Python 3.6
    {% raw %}container: ${{ matrix.python-version == '3.6' && 'python:3.6' || null }}{% endraw %}
    steps:
      - uses: actions/checkout@v6.0.0
      - uses: actions/setup-python@v6
        {% raw %}if: ${{ matrix.python-version != '3.6' }}{% endraw %}
        with:
          python-version: {% raw %}${{ matrix.python-version }}{% endraw %}
          allow-prereleases: true

      {% if needs_clickhouse %}
      - name: "Setup ClickHouse Server"
        uses: getsentry/action-clickhouse-in-ci@v1.6
      {% endif %}

      {% if needs_redis %}
      - name: Start Redis
        uses: supercharge/redis-github-action@2
      {% endif %}

      {% if needs_java %}
      - name: Install Java
        uses: actions/setup-java@v5
        with:
          distribution: 'temurin'
          java-version: '21'
      {% endif %}

      - name: Setup Test Env
        run: |
          pip install "coverage[toml]" tox
      - name: Erase coverage
        run: |
          coverage erase

      {% for framework in frameworks %}
      - name: Test {{ framework }}
        run: |
          set -x # print commands that are executed
          ./scripts/runtox.sh "{% raw %}py${{ matrix.python-version }}{% endraw %}-{{ framework }}"
      {% endfor %}

      - name: Generate coverage XML (Python 3.6)
        if: {% raw %}${{ !cancelled() && matrix.python-version == '3.6' }}{% endraw %}
        run: |
          export COVERAGE_RCFILE=.coveragerc36
          coverage combine .coverage-sentry-*
          coverage xml --ignore-errors

      - name: Generate coverage XML
        if: {% raw %}${{ !cancelled() && matrix.python-version != '3.6' }}{% endraw %}
        run: |
          coverage combine .coverage-sentry-*
          coverage xml

      - name: Upload coverage to Codecov
        if: {% raw %}${{ !cancelled() }}{% endraw %}
        uses: codecov/codecov-action@v5.5.1
        with:
          token: {% raw %}${{ secrets.CODECOV_TOKEN }}{% endraw %}
          files: coverage.xml
          # make sure no plugins alter our coverage reports
          plugins: noop
          verbose: true

      - name: Upload test results to Codecov
        if: {% raw %}${{ !cancelled() }}{% endraw %}
        uses: codecov/test-results-action@v1
        with:
          token: {% raw %}${{ secrets.CODECOV_TOKEN }}{% endraw %}
          files: .junitxml
          verbose: true
